package individual.ircon.bilibili.ui;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.fxml.JavaFXBuilderFactory;
import javafx.scene.control.Alert;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;

import java.net.URL;
import java.util.List;
import java.util.Random;
import java.util.ResourceBundle;

public class Lottery implements Initializable {
    @FXML private TableView<Shortlist> ShortLists;
    @FXML private TableView<Shortlist> Winner;
    @FXML private TextField Number;

    private ObservableList<Shortlist> ListForShort;
    private ObservableList<Shortlist> ListForWinner;

    private Random rand = new Random(System.currentTimeMillis());

    /// =================
    /// === Construct ===
    /// =================
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        /// TableView
        ListForShort = FXCollections.observableArrayList();
        ListForWinner = FXCollections.observableArrayList();


        ShortLists.setItems(ListForShort);
        Winner.setItems(ListForWinner);

        setColumn(ShortLists);
        setColumn(Winner);

        /// debug
//        for(int i = 0; i < 101; ++i) {
//            ListForShort.addAll(new Shortlist(i + 10000, "xixi" + i));
//        }

    }

    /// =========================
    /// === Private Processor ===
    /// =========================
    /**
     * 设置列的对象
     * @param view 表格对象
     */
    private void setColumn(TableView<Shortlist> view) {
        TableColumn<Shortlist, String> short_id_col = new TableColumn<>("用户ID");
        short_id_col.setCellValueFactory(param -> param.getValue().userIDProperty().asString());
        TableColumn<Shortlist, String> short_name_col = new TableColumn<>("用户昵称");
        short_name_col.setCellValueFactory(param -> param.getValue().userNameProperty());

        view.getColumns().addAll(short_id_col, short_name_col);
    }

    /**
     * 弹出一个消息框。
     * @param type 类型
     * @param tittle 标题
     * @param info 信息
     */
    private void alter(Alert.AlertType type, String tittle, String info) {
        Alert al = new Alert(type);
        al.setContentText(info);
        al.setTitle(tittle);
        al.show();
    }

    private int getRandomNum() {
        return rand.nextInt(ListForShort.size());
    }

    /**
     * 抽奖按钮。
     */
    @FXML
    private void goLottery() {
        if(ListForShort.isEmpty()) { // 如果候选人名单为空。
            alter(Alert.AlertType.ERROR, "警告", "待抽奖人数为空。");
        }else{

            /// 获取抽奖人数处理
            Integer num = null;
            try {
                num = Integer.valueOf(Number.getText());
            }catch (NumberFormatException e) {
                e.printStackTrace();
            }

            if(num == null) { // 输入的数字有问题
                alter(Alert.AlertType.ERROR, "错误", "输入的数字格式有误。");
                return;
            }

            int n = num;

            if(n > ListForShort.size()) { // 如果抽奖人数大于待抽奖人数。
                alter(Alert.AlertType.ERROR, "错误", "输入的数字大于待抽奖人数");
                return;
            }

            /// 抽选过程
            for(int i = 0; i < n; ++i) {
                int ind = getRandomNum();
                var it = ListForShort.remove(ind);
                ListForWinner.add(it);
            }
        }
    }

    /**
     * 点击复制名单按钮。
     */
    @FXML
    private void copyList() {
        if(ListForWinner.isEmpty()) {
            alter(Alert.AlertType.WARNING, "警告", "获奖人为空");
        }else{
            StringBuilder sb = new StringBuilder();

            for(var v: ListForWinner) {
                sb.append(v.getUserID())
                        .append('\t')
                        .append(v.getUserName())
                        .append('\n');
            }
            setClipboard(sb.toString());
        }
    }

    /**
     * 设置粘贴板的内容。
     * @param txt 内容。
     */
    private void setClipboard(String txt) {
        Clipboard clipboard = Clipboard.getSystemClipboard();
        ClipboardContent content = new ClipboardContent();
        content.putString(txt);
        clipboard.setContent(content);
    }

    /// =======================
    /// === Public Function ===
    /// =======================

    /**
     * 获取加载器。已经设置好了加载方法。注意，使用这个方法的人，得到loader之后直接load()。
     * @return 加载器。
     */
    public static FXMLLoader getLoader() {
        FXMLLoader loader = new FXMLLoader(Lottery.class.getResource("Lottery.fxml"));
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        return loader;
    }

    /**
     * 添加候选人。
     * @param item 候选人的对象。
     */
    public void addItem(Shortlist item) {
        ListForShort.add(item);
    }

    /**
     * 添加候选人。
     * @param item 候选人数组。
     */
    public void addItem(Shortlist... item) {
        ListForShort.addAll(item);
    }

    /**
     * 一次添加一个列表。
     * @param list 列表对象。
     */
    public void addAll(List<Shortlist> list) {
        ListForShort.addAll(list);
    }
}

